﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "CollaborationCacheInterface.h"

namespace gcmp
{
    class IDocument;

    /// \brief Element占用者工具类
    class COLLABORATION_CACHE_INTERFACE_EXPORT ElementOccupantUtils final
    {
    public:
        /// \brief 根据ElementId从缓存中获取Element的占用者信息
        ///
        /// ElementId不在缓存中，返回-1
        ///
        /// \param pDocument 文档指针
        /// \param elementId 需要获取占用者信息的ElementId
        /// \return int64_t 对应Element的占用者信息
        static int64_t GetElementOccupant(const IDocument * pDocument, const ElementId & elementId);

        /// \brief 根据ElementIds从缓存中批量获取Element的占用者信息
        ///
        /// ElementId不在缓存中，占用者信息为-1
        ///
        /// \param pDocument 文档指针
        /// \param elementIds 需要获取占用者信息的批量ElementIds
        /// \return 批量获取的ElementId及对应占用者信息
        static std::unordered_map<ElementId, int64_t, ElementIdHash> GetElementsOccupant(const IDocument * pDocument, const std::vector<ElementId> & elementIds);

        /// \brief 获取缓存中该占用者下的所有ElementId
        ///
        /// \param pDocument 文档指针
        /// \param occupantId 占用者信息
        /// \return 该占用者下的所有ElementId
        static std::vector<ElementId> GetElementIdsByOccupant(const IDocument* pDocument, int64_t occupantId);

        /// \brief 获取缓存中所有Element的占用者信息
        ///
        /// \param pDocument 文档指针
        /// \return 缓存中所有ElementId及对应占用者信息
        static const std::unordered_map<ElementId, int64_t, ElementIdHash> * GetAllElementsOccupant(const IDocument* pDocument);

        /// \brief 根据ElementId向缓存中设置Element的占用者
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocument 文档指针
        /// \param elementId 需要设置版本的ElementId
        /// \param occupantId 占用者信息
        /// \return void
        static void SetElementOccupant(IDocument* pDocument, const ElementId& elementId, int64_t occupantId);

        /// \brief 根据ElementIds向缓存中批量设置Element的占用者信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocument 文档指针
        /// \param elementsOccupant 需要设置版本的ElementIds及对应版本号
        /// \return void
        static void SetElementsOccupant(IDocument * pDocument, const std::unordered_map<ElementId, int64_t, ElementIdHash> & elementsOccupant);

        /// \brief 根据ElementIds删除缓存中Element的占用者信息
        ///
        /// \param pDocument 文档指针
        /// \param elementId 需要删除占用者信息的ElementId
        /// \return void
        static void DeleteElementOccupant(IDocument * pDocument, const ElementId & elementId);

        /// \brief 根据ElementIds批量删除缓存中Element的占用者信息
        ///
        /// \param pDocument 文档指针
        /// \param elementId 需要删除占用者信息的批量ElementId
        /// \return void
        static void DeleteElementsOccupant(IDocument * pDocument, const std::vector<ElementId> & elementIds);
    };
}


